#include "cod_errores.h"

void loopCorto();
void loopLargo(int largo);

// separo las senializaciones
void iniciarError(){
  prenderLEDRojo();
  apagarLEDVerde();
  loopLargo(1);
}

void iniciarWarning(){
  apagarLEDRojo();
  prenderLEDVerde();
  loopLargo(1);
}

// codigos distintos para el 1 y para el 0
// el 0 son parpadeos rapidos, el 1 luz fija
void rojo1(){
  iniciarWarning();  
  prenderLEDVerde();
  prenderLEDRojo();
  loopLargo(2);

}

void rojo0(){
  iniciarWarning();
  prenderLEDVerde();
  apagarLEDRojo();
  loopCorto();
  prenderLEDRojo();
  loopCorto();
  apagarLEDRojo();
  loopCorto();
  prenderLEDRojo();
  loopCorto();
  apagarLEDRojo();
}

void verde1(){
  iniciarError();
  prenderLEDRojo();
  prenderLEDVerde();
  loopLargo(2);
}

void verde0(){
  iniciarError();
  prenderLEDRojo();
  apagarLEDVerde();
  loopCorto();
  prenderLEDVerde();
  loopCorto();
  apagarLEDVerde();
  loopCorto();
  prenderLEDVerde();
  loopCorto();
  apagarLEDVerde();
}

void warning(char nro){
  int i=3;
  // de mas significativo a menos
  for(i=3;i>=0;i--){
    if(CHEQUEO_BIT(nro,i)){
      rojo1();
      loopLargo(3);
    }
    else{
      rojo0();
      loopLargo(3);
    }
  }
}

void error(char nro){
  int i=7;
  // de mas significativo a menos
  for(i=7;i>=4;i--){
    if(CHEQUEO_BIT(nro,i)){
      verde1();
      loopLargo(3);
    }
    else{
      verde0();
      loopLargo(3);
    }
  }
}
void clearError(){
  apagarLEDRojo();
  apagarLEDVerde();
}

void signalError(char codigoError){
  signalStartError();
  
  int j=0;
//  codigos de error menores a 4 son warnings
  switch(codigoError){
      case 0:
      loopLargo(3);
      warning(codigoError);
      loopLargo(3);
      break;
      
      case 1:
      loopLargo(3);
      warning(codigoError);
      loopLargo(3);
      break;
      
      case 2:
      loopLargo(3);
      warning(codigoError);
      loopLargo(3);
      break;
      
      case 3:
      loopLargo(3);
      warning(codigoError);
      loopLargo(3);
      break;
      
      case 4:
        while(1){
          loopLargo(3);
          error(codigoError);
          loopLargo(3);      
          apagarLEDRojo();
          apagarLEDVerde();          
          loopLargo(6);
          signalStartError();
        }
      break;
      
      case 5:
        while(1){
          loopLargo(3);
          error(codigoError);
          loopLargo(3);      
          apagarLEDRojo();
          apagarLEDVerde();          
          loopLargo(6);
          signalStartError();
        }
      break;
      
      case 6:
        while(1){
          loopLargo(3);
          error(codigoError);
          loopLargo(3);      
          apagarLEDRojo();
          apagarLEDVerde();          
          loopLargo(6);
          signalStartError();
        }
      break;
      
      case 7:
        while(1){
          loopLargo(3);
          error(codigoError);
          loopLargo(3);      
          apagarLEDRojo();
          apagarLEDVerde();          
          loopLargo(6);
          signalStartError();
        }
      break;
  // error sin especificar, ademas queda bloqueado
  // muestra el numero del error como parpadeos de ambos LEDs    
  default:
    
    while(1){
      prenderLEDRojo();
      prenderLEDVerde();
      
      while(j<=codigoError){
        loopLargo(3);
        BSP_TOGGLE_LED1();
        BSP_TOGGLE_LED2();
        j++;
      }
      
      loopLargo(6);
    signalStartError();
    apagarLEDRojo();
    apagarLEDVerde();
    loopLargo(2);
    j = 0;
    }
  }
}

void prenderLEDRojo(){
  BSP_TURN_ON_LED1();
}

void apagarLEDRojo(){
  BSP_TURN_OFF_LED1();
}

void prenderLEDVerde(){
  BSP_TURN_ON_LED2();
}

void apagarLEDVerde(){
  BSP_TURN_OFF_LED2();
}

void signalStartError(){

  int j=0;
  // busy wait para ver si todo va bien en el inicio
  while(j<10)
    {
      loopCorto();
      BSP_TOGGLE_LED2();
      loopLargo(1);
      BSP_TOGGLE_LED1();
      j++;
    }
}



void loopCorto(){
  int i=0;
  for(i = 0; i < 0xFFFF; i++){}
//  for(i = 0; i < 0xFFFF; i++){}  
}

void loopLargo(int largo){
  int j=0;
  for(j=0;j<largo;j++){
    int i=0;
    for(i = 0; i < 0xFFFF; i++){}
    for(i = 0; i < 0xFFFF; i++){}
    for(i = 0; i < 0xFFFF; i++){}  
  }
}